// 引入封装好的es7的async语法
import {
  getSetting,
  chooseAddress,
  openSetting,
  showModal,
  showToast
} from "../../utils/async.js";
import regeneratorRuntime from '../../lib/runtime/runtime'
Page({
  data: {
    address: {},
    cart: [],
    allChecked: false,
    totalPrice: 0,
    totalNum: 0
  },
  onShow() {
    // 获取缓存中的收货地址
    const address = wx.getStorageSync('address')
    // 获取缓存中的购物车数据
    const cart = wx.getStorageSync('cart') || []
    this.setData({
      address
    })
    this.setCart(cart)
  },
  // 获取收货地址的回调
  async handleChooseAddress() {
    try {
      // 1.获取  权限状态
      const res1 = await getSetting()
      // 发现一些属性名很怪异的时候，用[""]起来
      const scopeAddress = res1.authSetting["scope.address"]
      // 2.判断  权限状态
      if (scopeAddress === false) {
        // 3.如果用户以前没有授予过权限，先授予权限
        await openSetting()
      }
      // 4.调用获取收货地址的api
      const address = await chooseAddress()
      // 存入在缓存中
      wx.setStorageSync('address', address)
    } catch (error) {
      console.log(error);
    }
  },
  // 商品的选中按钮回调
  handleItemChange(e) {
    // 1.获取别修改的商品的id
    const goods_id = e.currentTarget.dataset.id
    // console.log(goods_id);
    // 2.获取购物车数组
    let {
      cart
    } = this.data
    // 3.找到别修改的商品对象 改变它的checked属性
    let index = cart.findIndex(v => v.goods_id === goods_id)
    // 4.取反
    cart[index].checked = !cart[index].checked
    this.setCart(cart)
  },
  // 封装重新计算 data里面的数据
  setCart(cart) {
    // 重新计算价格
    let allChecked = true
    let totalPrice = 0
    let totalNum = 0
    cart.forEach(element => {
      if (element.checked) {
        totalPrice += element.num * element.goods_price
        totalNum += element.num
      } else {
        allChecked = false
      }
    });
    // 判断数组是否为空
    allChecked = cart.length != 0 ? allChecked : false
    // 5.把购物车数据重新设置回data中和缓存中
    this.setData({
      cart,
      totalPrice,
      totalNum,
      allChecked
    })
    wx.setStorageSync("cart", cart)
  },
  // 全选按钮的回调
  handleAllChecked() {
    // 获取data中的数据
    let {
      cart,
      allChecked
    } = this.data
    // 修改值
    allChecked = !allChecked
    // 循环把购物车所有的checked的值等于allChecked
    cart.forEach(v => v.checked = allChecked)
    // 把修改的值 填充回data中或缓存中
    this.setCart(cart)
  },
  // 加 减 商品按钮的回调
  async handleItemNumEdit(e) {
    // 1.获取传递过来的id和加减值
    const {
      operation,
      id
    } = e.currentTarget.dataset
    // 2.获取购物车数组
    let {
      cart
    } = this.data
    // 3.找到需要修改的商品的索引
    const index = cart.findIndex(v => v.goods_id === id)
    // 当num值为1了并且用户点击的是减号  弹出提示框
    if (cart[index].num === 1 && operation === -1) {
      const res = await showModal({content:"您确定要删除该商品吗?"})
      if (res.confirm) {
        // 用户点击了确定
        cart.splice(index, 1)
        this.setCart(cart)
      } 
    } else {
      // 4.修改对应的属性值  num
      cart[index].num += operation
    }
    this.setCart(cart)
  },
  // 结算按钮的回调
  async handlePay(){
    // 1.判断有没有收货地址
    const {address,totalNum} = this.data
    if(!address.userName){
      await showToast({title:"您还没有选择收货地址哦"})
      return
    }
    // 2.判断用户有没有选购商品
    if(totalNum === 0){
      await showToast({title:"您还没有选购商品哦"})
      return
    }
    // 3.若都没有以上情况,跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/index',
    })
  }
})